home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / madtrb1.arc / MENU.INC < prev    next >
Text File  |  1986-03-03  |  22KB  |  579 lines

  1. { MENU.INC }
  2.  
  3. { *************************************************************************** }
  4. { *                                                                         * }
  5. { *                TURBO SCREEN INPUT PRE-PROCESSOR TOOLKIT                 * }
  6. { *                                                                         * }
  7. { *                      MENU SUBPROGRAM INCLUDE FILE                       * }
  8. { *                                                                         * }
  9. { *                             Version  1.07                               * }
  10. { *                                                                         * }
  11. { *                                                                         * }
  12. { *    This include file contains the modules necessary to support as many  * }
  13. { *    menu pages as your application program requires.                     * }
  14. { *                                                                         * }
  15. { *    Note that further documentation on menu support can be found in      * }
  16. { *    the documentation file 'Tsipp.Doc'.                                  * }
  17. { *                                                                         * }
  18. { *************************************************************************** }
  19.  
  20.  
  21.  
  22. Const { Menu Data Structure Constants }
  23.  
  24.   MENU_RECORD_LIMIT=40;                { maximum number of entries allowed in any given menu }
  25.  
  26.   MAX_SIZE_OF_MENU_PROMPT=40;          { size of menu prompt string }
  27.  
  28.  
  29.  
  30. Type { Menu Data Structure }
  31.  
  32.   MenuRecordPtr=^MenuRecord;           { pointer to a menu template record stored in the heap }
  33.   MenuRecord=                          { record type used for menu templates used to store }
  34.     Record                             { specific information about a particular menu prompt }
  35.       PromptCol,
  36.       PromptRow,
  37.       UpKeyPointer,
  38.       DownKeyPointer,
  39.       LeftKeyPointer,
  40.       RightKeyPointer:Integer;
  41.       Prompt:String[MAX_SIZE_OF_MENU_PROMPT];
  42.     End; { MenuRecord }
  43.  
  44.   TypicalMenuPage=                     { an record data type which stores }
  45.     Record                             { for each menu: }
  46.       Image:TextScreenPtr;                                     { a menu screen image }
  47.       Template:Array[1..MENU_RECORD_LIMIT] Of MenuRecordPtr;   { a menu screen template }
  48.     End; { TypicalMenuPage }
  49.  
  50.  
  51.  
  52. Var { Menu Data Structure Variables }
  53.  
  54.   Menus:
  55.     Array[1..MAX_NUM_OF_MENU_PAGES] Of TypicalMenuPage; { an array constructed of the data type TypicalMenuPage }
  56.  
  57.  
  58.  
  59. Procedure ReadMenuFiles;
  60.  
  61. { This procedure reads the menu screen page images and templates and stores
  62.   them into the proper Menus[MenuPage] record.  Note that menu screen page
  63.   images are stored under the file names 'Menu##.Col(or Mon)', where ##
  64.   refers to the menu page number, 'Col' refers to a color screen page, and
  65.   'Mon' refers to a monochrome screen page.  Note that menu templates are
  66.   stored under the file names 'Menu##.@@@', where ## refers to the menu page
  67.   number and '@@@' refers to template file extension constant previously
  68.   defined in the file 'Main.Mod'.
  69.  
  70.   Note that the template records are pointed to by the template array (an
  71.   array of pointers), and if there are not enough records from the template
  72.   file to fill the template array of pointers for a particular menu page,
  73.   those empty array pointers are set to Nil. }
  74.  
  75. Var
  76.   MenuPage:Integer;                    { an index to a particular menu page }
  77.   RecordNumber:Integer;                { an index to a particular menu template record }
  78.   Page:String[2];                      { a string used in determining the current menu page file number }
  79.   MenuTemplateFile:File Of MenuRecord; { menu file template type }
  80.  
  81. Begin   { ReadMenuFiles }
  82.   For MenuPage:=1 To MAX_NUM_OF_MENU_PAGES Do
  83.     With Menus[MenuPage] Do
  84.       Begin
  85.  
  86.         { determine file number portion of menu page file name }
  87.         Str(MenuPage,Page);            { convert integer file number into a string }
  88.         If MenuPage<=9 Then
  89.           Page:='0'+Page;
  90.  
  91.         { initializing screen page pointer }
  92.         Image:=Nil;
  93.  
  94.         { read menu page screen image }
  95.         ReadScreenPageFromFile('Menu_'+Page,Image);
  96.  
  97.         { read menu page template }
  98.         Assign(MenuTemplateFile,'Menu_'+Page+TEMPLATE_FILE_NAME_EXTENSION); { assign to a disk file }
  99.         Reset(MenuTemplateFile);       { open the file for reading }
  100.         For RecordNumber:=1 To MENU_RECORD_LIMIT Do
  101.           If Not Eof(MenuTemplateFile) Then
  102.             Begin
  103.               New(Template[RecordNumber]); { allocate space in heap for template record }
  104.               Read(MenuTemplateFile,Template[RecordNumber]^); { read record off of disk }
  105.             End { If Not Eof }
  106.           Else
  107.             Template[RecordNumber]:=Nil; { no record to read, set pointer in template array to Nil }
  108.         Close(MenuTemplateFile);       { close the file }
  109.  
  110.       End; { With Menus[MenuPage] }
  111. End;    { ReadMenuFiles }
  112.  
  113.  
  114.  
  115. Procedure DisposeOfMenuDynamicMemory;
  116.  
  117. { This procedure releases all the dynamically allocated memory used in for
  118.   menu pages back to the operating system. }
  119.  
  120. Var
  121.   MenuPage:Integer;                    { an index to a particular MenuPage }
  122.   Entry:Integer;                       { an index to a particular MenuPage template entry }
  123.  
  124. Begin   { DisposeOfMenuDynamicMemory }
  125.   For MenuPage:=1 To MAX_NUM_OF_MENU_PAGES Do
  126.     Begin
  127.       Dispose(Menus[MenuPage].Image);                { dispose screen page image }
  128.       For Entry:=1 To MENU_RECORD_LIMIT Do
  129.         If Menus[MenuPage].Template[Entry]<>Nil Then
  130.           Dispose(Menus[MenuPage].Template[Entry]);  { dispose of template entry }
  131.     End; { For MenuPage }
  132. End;    { DisposeOfMenuDynamicMemory }
  133.  
  134.  
  135.  
  136. Procedure MoveHighlightedMenuPromptModule(    OldPrompt,
  137.                                               NewPrompt:Integer);
  138.  
  139. { *************************************************************************** }
  140. { *                                                                         * }
  141. { *                  MOVE HIGHLIGHTED MENU PROMPT MODULE                    * }
  142. { *                                                                         * }
  143. { *    This module controls the movement of the highlighted prompt for      * }
  144. { *    the passed old and new menu prompt for the current menu page.        * }
  145. { *                                                                         * }
  146. { *************************************************************************** }
  147.  
  148.   Procedure ShowMenuPrompt(    MenuPrompt,
  149.                                PromptColor,
  150.                                PromptBackground:Integer);
  151.  
  152.   { This procedure is used exclusively to highlight the current menu prompt and
  153.     also to de-highlight the previous menu prompt, depending upon the screen
  154.     colors that are passed to this procedure. }
  155.  
  156.   Begin   { ShowMenuPrompt }
  157.     With Menus[MenuPage].Template[MenuPrompt]^ Do
  158.       Begin
  159.         TextColor(PromptColor);
  160.         TextBackground(PromptBackground);
  161.         GotoXY(PromptCol,PromptRow);
  162.         Write(Prompt);
  163.       End; { With Menus }
  164.   End;    { ShowMenuPrompt }
  165.  
  166.  
  167.  
  168. Begin   { MoveHighlightedMenuPromptModule }
  169.   ShowMenuPrompt(OldPrompt,ForegroundColor,0); { de-highlight old menu prompt }
  170.   ShowMenuPrompt(NewPrompt,HighlightColor,0);  { highlight new menu prompt }
  171. End;    { MoveHighlightedMenuPromptModule }
  172.  
  173.  
  174.  
  175. Procedure DrawMenuPagesModule;
  176.  
  177. { *************************************************************************** }
  178. { *                                                                         * }
  179. { *                       DRAW MENU PAGES MODULE                            * }
  180. { *                                                                         * }
  181. { *    This module controls the display of particular menu pages. Note that * }
  182. { *    the case statement below only supports 4 menu pages, but this can    * }
  183. { *    easily be added to inorder for this module to support additional     * }
  184. { *    menu pages.                                                          * }
  185. { *                                                                         * }
  186. { *    Note that within this module there is an example procedure that      * }
  187. { *    was used during program development to construct a screen page.      * }
  188. { *    Later, the screen pages are read from screen files and stored in the * }
  189. { *    heap for more rapid display.                                         * }
  190. { *                                                                         * }
  191. { *************************************************************************** }
  192.  
  193.  
  194.  
  195.   Procedure WriteMenuPrompts;
  196.  
  197.   { This procedure locates and prints on the screen all the menu prompts for
  198.     the current menu page.  This procedure looks at the menu template to
  199.     determine the required information for locating and printing out each menu
  200.     prompt. }
  201.  
  202.   Var
  203.     Entry:Integer;                     { index counter used in listing out the menu prompts from the menu template }
  204.  
  205.   Begin   { WriteMenuPrompts }
  206.     TextColor(ForegroundColor);
  207.     TextBackground(MenuBackgroundColor);
  208.     Entry:=1;                          { initialize menu prompt entry counter }
  209.     While Menus[MenuPage].Template[Entry]<>Nil Do { check that there is a menu template record available to use }
  210.       Begin                            { print out the menu prompt }
  211.         With Menus[MenuPage].Template[Entry]^ Do
  212.           Begin
  213.             GotoXY(PromptCol,PromptRow);
  214.             Write(Prompt);
  215.           End; { With Menus }
  216.         Entry:=Entry+1;                { increment menu prompt entry counter }
  217.       End; { While Menus }
  218.   End;    { WriteMenuPrompts }
  219.  
  220.  
  221.  
  222.   Procedure DrawMenuPage01;
  223.  
  224.   { This part of the procedure was used during program development of the
  225.     example application of the input pre-processor to construct a screen page.
  226.     This screen page is now stored in a screen file and thus the application
  227.     program no longer needs this code.  The screen page is read from a file and
  228.     stored in the heap for display.
  229.  
  230.     You may want to write a similar procedure during your application program
  231.     development. }
  232.  
  233.   Var
  234.     TextString:WorkString;             { string variable used in passing text to another procedure }
  235.  
  236.   Begin   { DrawMenuPage01 }
  237.  
  238.     { draw outer screen boundary }
  239.     TextColor(ForegroundColor);
  240.     TextBackground(MenuBackgroundColor);
  241.     DrawWindow2(1,1,80,25);
  242.  
  243.     { display program title }
  244.     TextBackground(BackgroundColor);
  245.     DrawWindow2(20,3,60,13);
  246.     TextColor(HighlightColor);
  247.     WriteCenterText(5,'COMPOSITE  BEAM');
  248.     WriteCenterText(7,'DESIGN  PROGRAM');
  249.     TextColor(ForegroundColor);
  250.     WriteCenterText(9,'version  1.07');
  251.     WriteCenterText(11,'written in Turbo Pascal');
  252.  
  253.     { display command menu on screen bottom }
  254.     TextBackground(MenuBackgroundColor);
  255.     TextString:='Make selection with  '+Chr(24)+'  '+Chr(25)+'  and then press <ENTER>';
  256.     WriteCenterText(25,TextString);
  257.  
  258.     WriteMenuPrompts;
  259. (*  WriteScreenPageToFile('MENU_01'); { write the screen page off to a screen file } *)
  260.   End;    { DrawMenuPage01 }
  261.  
  262.  
  263.  
  264. Begin   { DrawMenuPagesModule }
  265.   Case MenuPage Of
  266.     1 : Begin
  267. (*        DrawMenuPage01;              { this line was used during program development } *)
  268.           DisplayScreenPage(Menus[MenuPage].Image); { display screen page that is stored in the heap }
  269.         End; { page 1 }
  270.     2 : Begin
  271.         End; { page 2 }
  272.     3 : Begin
  273.         End; { page 3 }
  274.     4 : Begin
  275.         End; { page 4 }
  276.   End; { Case MenuPage }
  277.   MoveHighlightedMenuPromptModule(1,1);
  278. End;    { DrawMenuPagesModule }
  279.  
  280.  
  281.  
  282. Procedure MenuModule;
  283.  
  284. { *************************************************************************** }
  285. { *                                                                         * }
  286. { *                               MENU MODULE                               * }
  287. { *                                                                         * }
  288. { *    This module takes care of the display and user interaction with      * }
  289. { *    the program's menus.  This menu module uses menu templates in        * }
  290. { *    controlling the interaction between the user and the displayed       * }
  291. { *    menu.                                                                * }
  292. { *                                                                         * }
  293. { *    A menu template is simply a file containing information about the    * }
  294. { *    prompts (or descriptors) to be displayed when a particular menu is   * }
  295. { *    shown.  A menu template is a series of records where each record     * }
  296. { *    describes one particular prompt in that menu.  For more information  * }
  297. { *    on menu templates see the toolkit documentation file 'TOOLKIT.DOC'.  * }
  298. { *                                                                         * }
  299. { *************************************************************************** }
  300.  
  301.  
  302. Var { modular variables, i.e. global only to this module }
  303.   CurrentMenuPrompt:Integer;           { current menu prompt record being highlighted }
  304.   OldMenuPrompt:Integer;               { previous menu prompt that was highlighted }
  305.  
  306.  
  307.  
  308.   Procedure InitMenuVariables;
  309.  
  310.   { This procedure initializes the menu module's variables. }
  311.  
  312.   Begin   { InitMenuVariables }
  313.     OldMenuPrompt:=2;
  314.     CurrentMenuPrompt:=1;
  315.   End;    { InitMenuVariables }
  316.  
  317.  
  318.  
  319.  
  320.  
  321.   Procedure Escape;
  322.  
  323.   { This procedure controls the entry of a escape command.  Note that the
  324.     case statement below only supports 4 menu pages, but can easily be added to
  325.     inorder to support additional menu pages. }
  326.  
  327.   Begin   { Escape }
  328.     Case MenuPage Of
  329.       1 : Begin
  330.             SoundError;
  331.           End; { page 1 }
  332.       2 : Begin
  333.           End; { page 2 }
  334.       3 : Begin
  335.           End; { page 3 }
  336.       4 : Begin
  337.           End; { page 4 }
  338.     End; { Case MenuPage }
  339.   End;    { Escape }
  340.  
  341.  
  342.  
  343.   Procedure PageUp;
  344.  
  345.   { This procedure controls the entry of a page up command.  Note that the
  346.     case statement below only supports 4 menu pages, but can easily be added to
  347.     inorder to support additional menu pages. }
  348.  
  349.   Begin   { PageUp }
  350.     Case MenuPage Of
  351.       1 : Begin
  352.             SoundError;
  353.           End; { page 1 }
  354.       2 : Begin
  355.           End; { page 2 }
  356.       3 : Begin
  357.           End; { page 3 }
  358.       4 : Begin
  359.           End; { page 4 }
  360.     End; { Case MenuPage }
  361.   End;    { PageUp }
  362.  
  363.  
  364.  
  365.   Procedure PageDown;
  366.  
  367.   { This procedure controls the entry of a page down command.  Note that the
  368.     case statement below only supports 4 menu pages, but can easily be added to
  369.     inorder to support additional menu pages. }
  370.  
  371.   Begin   { PageDown }
  372.     Case MenuPage Of
  373.       1 : Begin
  374.             SoundError;
  375.           End; { page 1 }
  376.       2 : Begin
  377.           End; { page 2 }
  378.       3 : Begin
  379.           End; { page 3 }
  380.       4 : Begin
  381.           End; { page 4 }
  382.     End; { Case MenuPage }
  383.   End;    { PageDown }
  384.  
  385.  
  386.  
  387.   Procedure CurseUp;
  388.  
  389.   { This procedure controls the cursor's upward movement in the current menu.
  390.     It checks the menu template for the current menu page to see if the
  391.     requested cursor move is legal. }
  392.  
  393.   Begin   { CurseUp }
  394.     With Menus[MenuPage].Template[CurrentMenuPrompt]^ Do
  395.       Begin
  396.         If UpKeyPointer<>0 Then { check if legal move }
  397.           Begin { legal move }
  398.             OldMenuPrompt:=CurrentMenuPrompt;
  399.             CurrentMenuPrompt:=UpKeyPointer;
  400.             MoveHighlightedMenuPromptModule(OldMenuPrompt,CurrentMenuPrompt);
  401.           End { If UpKeyPointer }
  402.         Else { not a legal move }
  403.           SoundError;
  404.       End; { With Menus }
  405.   End;    { CurseUp }
  406.  
  407.  
  408.  
  409.   Procedure CurseDown;
  410.  
  411.   { This procedure controls the cursor's downward movement in the current
  412.     menu.  It checks the menu template for the current menu page to see if the
  413.     requested cursor move is legal. }
  414.  
  415.   Begin   { CurseDown }
  416.     With Menus[MenuPage].Template[CurrentMenuPrompt]^ Do
  417.       Begin
  418.         If DownKeyPointer<>0 Then { check if legal move }
  419.           Begin { legal move }
  420.             OldMenuPrompt:=CurrentMenuPrompt;
  421.             CurrentMenuPrompt:=DownKeyPointer;
  422.             MoveHighlightedMenuPromptModule(OldMenuPrompt,CurrentMenuPrompt);
  423.           End { If DownKeyPointer }
  424.         Else { not a legal move }
  425.           SoundError;
  426.       End; { With Menus }
  427.   End;    { CurseDown }
  428.  
  429.  
  430.  
  431.   Procedure CurseLeft;
  432.  
  433.   { This procedure controls the cursor's leftward movement in the current
  434.     menu.  It checks the menu template for the current menu page to see if the
  435.     requested cursor move is legal. }
  436.  
  437.   Begin   { CurseLeft }
  438.     With Menus[MenuPage].Template[CurrentMenuPrompt]^ Do
  439.       Begin
  440.         If LeftKeyPointer<>0 Then { check if legal move }
  441.           Begin { legal move }
  442.             OldMenuPrompt:=CurrentMenuPrompt;
  443.             CurrentMenuPrompt:=LeftKeyPointer;
  444.             MoveHighlightedMenuPromptModule(OldMenuPrompt,CurrentMenuPrompt);
  445.           End { If LeftKeyPointer }
  446.         Else { not a legal move }
  447.           SoundError;
  448.       End; { With Menus }
  449.   End;    { CurseLeft }
  450.  
  451.  
  452.  
  453.   Procedure CurseRight;
  454.  
  455.   { This procedure controls the cursor's rightward movement in the current
  456.     menu.  It checks the menu template for the current menu page to see if the
  457.     requested cursor move is legal. }
  458.  
  459.   Begin   { CurseRight }
  460.     With Menus[MenuPage].Template[CurrentMenuPrompt]^ Do
  461.       Begin
  462.         If RightKeyPointer<>0 Then { check if legal move }
  463.           Begin { legal move }
  464.             OldMenuPrompt:=CurrentMenuPrompt;
  465.             CurrentMenuPrompt:=RightKeyPointer;
  466.             MoveHighlightedMenuPromptModule(OldMenuPrompt,CurrentMenuPrompt);
  467.           End { If RightKeyPointer }
  468.         Else { not a legal move }
  469.           SoundError;
  470.       End; { With Menus }
  471.   End;    { CurseRight }
  472.  
  473.  
  474.  
  475.   Procedure ProgramControl;
  476.  
  477.   { This procedure is used by the example application of the input
  478.     pre-processor to give an example of a menu control.  You may want to write
  479.     a similar procedure for your application.
  480.  
  481.     This procedure follows the user's system command from the program's menu:
  482.  
  483.            Input Member Data
  484.            Execute Analysis and Design
  485.            Print Design Results
  486.            Exit Program
  487.  
  488.     Note that this procedure is setup to pass control to G_I_Page 1 or to
  489.     exit the pre-processor. }
  490.  
  491.   Begin   { ProgramControl }
  492.     Case CurrentMenuPrompt Of
  493.       1 : Begin { Input Member Data }
  494.             CurrentPage:=G_I; { pass control to G_I_Page 1 }
  495.             G_I_Page:=1;
  496.           End;  { Input Member Data }
  497.       2 : Begin { Execute Analysis and Design }
  498.             CurrentPage:=G_I; { pass control to G_I_Page 1 }
  499.             G_I_Page:=1;
  500.           End;  { Execute Analysis and Design }
  501.       3 : Begin { Print Design Results }
  502.             CurrentPage:=G_I; { pass control to G_I_Page 1 }
  503.             G_I_Page:=1;
  504.           End;  { Print Design Results }
  505.       4 : Begin { Exit Program }
  506.             CurrentPage:=Exit; { exit program back to operating system }
  507.           End;  { Exit Program }
  508.     End; { Case CurrentMenuPrompt }
  509.   End;    { ProgramControl }
  510.  
  511.  
  512.  
  513.   Procedure MenuControl;
  514.  
  515.   { This procedure is used in the passing of control to specific procedures for
  516.     the control of particular menus.  Note that the below Case statement only
  517.     supports 4 menu pages, but this can easily be added to inorder to support
  518.     additional menu pages. }
  519.  
  520.   Begin   { MenuControl }
  521.     Case MenuPage Of
  522.       1 : Begin
  523.             ProgramControl;
  524.           End; { page 1 }
  525.       2 : Begin
  526.           End; { page 2 }
  527.       3 : Begin
  528.           End; { page 3 }
  529.       4 : Begin
  530.           End; { page 4 }
  531.     End; { Case MenuPage }
  532.   End;    { MenuControl }
  533.  
  534.  
  535.  
  536.   Procedure ReadKeyboard;
  537.  
  538.   { This procedure determines what the user's keyboard entry is.  It then
  539.     passes control to specific procedures as screen commands are called upon. }
  540.  
  541.   Var
  542.     KeyboardEntry:Char;                { character variable used in reading the keyboard }
  543.  
  544.   Begin   { ReadKeyboard }
  545.     Repeat
  546.       Read(Kbd,KeyboardEntry);
  547.         If (KeyboardEntry=Chr(27)) And Keypressed Then  { read a character, check for a double character entry }
  548.           Begin { double character entry }
  549.             Read(Kbd,KeyboardEntry);
  550.             Case Ord(KeyboardEntry) Of
  551.               73 : PageUp;
  552.               81 : PageDown;
  553.               72 : CurseUp;
  554.               80 : CurseDown;
  555.               75 : CurseLeft;
  556.               77 : CurseRight;
  557.             Else { illegal keystroke }
  558.               SoundError;
  559.             End; { Else }
  560.           End { If KeyboardEntry }
  561.         Else { single character entry }
  562.           Case Ord(KeyBoardEntry) Of
  563.             27 : Escape;
  564.             13 : Begin { absorb the return keystroke }
  565.                  End;
  566.           Else { illegal keystroke }
  567.             SoundError;
  568.           End; { Case KeyBoardEntry }
  569.     Until KeyboardEntry=Chr(13);       { until received carriage return }
  570.   End;    { ReadKeyboard }
  571.  
  572.  
  573.  
  574. Begin   { MenuModule }
  575.   InitMenuVariables;
  576.   DrawMenuPagesModule;
  577.   ReadKeyboard;
  578.   MenuControl;
  579. End;    { MenuModule }